package models;

import boardGenerator.GameDifficultyLevel;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;


/**
 * Clase TopTen implementa la lista de mejores jugadas
 * segun el nivel de dificultad. Implementa una clase
 * serializable, permitiendo asi guardar el archivo objeto
 * en disco y cargar todas la partidas de manera mas simple.
 */
public class TopTen implements Serializable{ 
    private ArrayList<Jugador> facil;
    private ArrayList<Jugador> medio;
    private ArrayList<Jugador> dificil;

    /**
     * Constructor de la clase.
     * Primero lee las partidas existentes
     * si no existen crea nuevas listas vacias
     */
    public TopTen(){
        TopTen tmp = this.load();
        if (tmp == null){
            this.facil = new ArrayList<Jugador>();
            this.medio = new ArrayList<Jugador>();
            this.dificil = new ArrayList<Jugador>();
        } else {
            this.facil = tmp.getList("EASY");
            this.medio = tmp.getList("MODERATE");
            this.dificil = tmp.getList("HARD");
        }
    }   
    
    /**
     * Obtiene la lista de jugadas segun dificultad
     * @param difficulty "EASY" "MODERATE" "HARD"
     * @return 
     */
    public ArrayList<Jugador> getList(String difficulty){        
        switch (difficulty) {
            case "EASY": return facil;
            case "MODERATE": return medio;
            case "HARD": return dificil;
        }
        return null;
    }
    
    /**
     * Permmite Agregar una nueva jugada
     * a la lista de top tens segun dificultad
     * @param newJugador 
     */
    public void addJugada(Jugador newJugador){
      if(newJugador.getDificultad()== GameDifficultyLevel.EASY){
          insertarJugada(facil,newJugador);
      }  
      if(newJugador.getDificultad()== GameDifficultyLevel.MODERATE){
          insertarJugada(medio,newJugador);
      } 
      if(newJugador.getDificultad()== GameDifficultyLevel.HARD){
          insertarJugada(dificil,newJugador);
      } 
    }
    
    /**
     * Imprime la lista de jugadas segun dificultad
     * "EASY" "MODERATE" "HARD"
     * @param difficulty 
     */
    public void printLista(String difficulty) {
        ArrayList<Jugador> lista = getList(difficulty);
        for (Jugador jugador : lista){
            System.out.println(jugador);            
        }
    }    
    
    /**
     * Metodo que permite insertar una jugada segun la dificultad
     * en la cual fue realizada, ordena la lista por puntaje y
     * evita que la lista sea de mas de 10 elementos
     * @param lista
     * @param newJugador 
     */
    private void insertarJugada(ArrayList<Jugador> lista,Jugador newJugador) {
        lista.add(newJugador);
        Collections.sort(lista);
        if(lista.size()>10)            
            lista.remove(10);        
        save(this);
    }
    
    /**
     * Permite Guardar la lista de topten en archivo
     * guarda el objeto de tipo TopTen el cual esta compuesto
     * por listas de tipo Jugador
     * @param obj
     * @return 
     */
    private static boolean save(TopTen obj){
        try {
            //fichero en el que se guardará el objeto
            FileOutputStream file=new FileOutputStream("topten.dat");
            //canal de salida del fichero
            ObjectOutputStream os;
            os = new ObjectOutputStream(file);
            //escribimos el objeto en el fichero
            os.writeObject(obj);
            //cerramos el canal de salida y el fichero
            os.close();
            file.close();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    
    /**
     * Permite Cargar el archivo de topten creado
     * el cual contiene las partidas jugadas segun dificultad
     * @return 
     */
    private static TopTen load(){
        TopTen obj;
        try {
            FileInputStream fis = new FileInputStream("topten.dat");
            ObjectInputStream ois = new ObjectInputStream (fis);
            obj =(TopTen) ois.readObject();
            ois.close();
            fis.close();
        } catch (IOException e) {
            /*Si el archivo no existe no cargo nada*/
            return null;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        }
        return obj;
    }
}